// Interface data format used to return a unified format
import { ResultEnum } from "../src/config/httpEnum";

type Recordable<T = any> = Record<string, T>;

/**
 * 请求成功的接口
 * @param data 响应的业务数据
 * @param param1 响应接口的基础配置
 * @returns mock接口的 response 选项
 */
export function resultSuccess<T = Recordable>(data: T, { msg = "ok" } = {}) {
    return {
        code: ResultEnum.SUCCESS,
        data,
        msg,
        type: "success"
    };
}

/**
 * 请求错误的接口
 * @param message 请求错误的说明
 * @param param1
 * @returns
 */
export function resultError(msg = "Request failed", { code = ResultEnum.ERROR, data = null } = {}) {
    return {
        code,
        data,
        msg,
        type: "error"
    };
}

/**
 * 分页接口
 * @param page 页码
 * @param pageSize 每页数量
 * @param list 列表数据
 * @param param3 接口基础配置
 * @returns 响应成功的接口，并且业务数据包含当前分页的列表数据和总数据行数
 */
export function resultPageSuccess<T = any>(page: number, pageSize: number, list: T[], { message = "ok" } = {}) {
    const pageData = pagination(page, pageSize, list);

    return {
        ...resultSuccess({
            items: pageData,
            total: list.length
        }),
        message
    };
}

/**
 * 分页从数据库中获取数据
 * @param pageNo 页码
 * @param pageSize 每页数目
 * @param array 总的列表数据，也就是“数据库”
 * @returns 分好页的列表数据
 */
export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
    const offset = (pageNo - 1) * Number(pageSize);
    return offset + Number(pageSize) >= array.length
        ? array.slice(offset, array.length)
        : array.slice(offset, offset + Number(pageSize));
}

/**
 * 接口接收到的请求对象的类型，这其实也是mock接口对象中 response 选项的参数 options 的类型
 */
export interface RequestParams {
    method: string;
    body: any;
    headers?: { authorization?: string };
    query: any;
}

/**
 * @description 本函数用于从request数据中获取token，请根据项目的实际情况修改
 */
export function getRequestToken({ headers }: RequestParams): string | undefined {
    return headers?.authorization;
}
